package com.example.demo.handle;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.demo.Bean.Student;
import com.example.demo.service.StudentService;

import java.util.ArrayList;
import java.util.List;


    public class ExcelHandle extends AnalysisEventListener<Student> {

        private List<Student> list = new ArrayList<>();
        /**
         * 每隔300条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
         */
        private static final int BATCH_COUNT = 300;

        /**
         * 假设这个是一个DAO，当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
         */
        private StudentService studentService;
        private String courseId;

        /**
         * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
         */
        public ExcelHandle(StudentService studentService,String courseId) {
            this.studentService = studentService;
            this.courseId = courseId;
        }


        /**
         * 这个每一条数据解析都会来调用
         */
        @Override
        public void invoke(Student students, AnalysisContext analysisContext) {
            System.out.println("解析到一条数据:========================"+students.toString());
            // 数据存储到datas，供批量处理，或后续自己业务逻辑处理。
            list.add(students);
            // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
            try {
                if (list.size() >= BATCH_COUNT) {
                    saveData(courseId);
                    // 存储完成清理datas
                    list.clear();
                }
            }catch (Exception e){
                throw new RuntimeException(e);
            }

        }

        /**
         * 所有数据解析完成了 都会来调用
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
            try {
                saveData(courseId);//确保所有数据都能入库
            }catch (Exception e){
                throw new RuntimeException(e);
            }
        }

        /**
         * 加上存储数据库
         */
        private void saveData(String courseId) throws Exception {
            System.out.println("=============================="+list.size()+"条数据，开始存储到数据库");
            studentService.saveList(list,courseId);
        }

    }
